package conductores;

import java.util.ArrayList;

/**
 * @author marc
 * 
 */

public class Board implements Cloneable {

	public ArrayList<Integer> pendientes;
	public ArrayList<Conductor> conductores;	

	// Constructor
	public Board() {
		define();
	}

	public Board(IEstadoInicial estadoInicial) {
		init();
		creaEstatInicial(estadoInicial);
	}

	private void define() {

		pendientes = new ArrayList<Integer>();
		conductores = new ArrayList<Conductor>();
	}

	private void init() {

		define();

		Usuario[] usuarios = Context.getInstance().getUsuarios();
		for (int i = 0; i < Context.getInstance().getNombreUsuaris(); i++) {
			if (usuarios[i].esconductor) {
				conductores.add(new Conductor(i));
			} else {
				pendientes.add(i);
			}
		}
	}

	public void creaEstatInicial(IEstadoInicial estadoInicial) {
		estadoInicial.execute(this);
	}

	public ArrayList<Integer> getPendientes() {
		return pendientes;
	}

	public void setPendientes(ArrayList<Integer> pend) {
		pendientes = pend;
	}

	public ArrayList<Conductor> getConductores() {
		return conductores;
	}

	public void setConductores(ArrayList<Conductor> cond) {
		conductores = cond;
	}

	public Board clone() {
		Board clone = new Board();

		for (Integer user : getPendientes()) {
			clone.getPendientes().add(user);
		}

		for (Conductor cond : getConductores()) {
			clone.getConductores().add(cond.clone());
		}

		return clone;
	}

	public int getDistanciaTotal() {
		int distTotal = 0;
		for (Conductor c : getConductores()) {
			distTotal += c.getDistanciaTotal();
		}
		return distTotal;
	}

	public void opMeter(Conductor conductor, int usu, int posRec, int posDej) {
		//conductor.addUser(usu, posRec, posDej);
		conductor.ruta.add(posRec, usu);
		conductor.ruta.add(posDej, -usu);
		conductor.calculaDistancia();
		pendientes.remove((Integer) usu);
	}

	public void printListaPendientesConductores() {
		// aqui se expulsan lapos
		for (int i = 0; i < pendientes.size(); i++) {
			System.out.print(pendientes.get(i) + " ");
		}

		System.out.println();

		for (int i = 0; i < conductores.size(); i++) {
			System.out.print(conductores.get(i).identificador + " ");
		}

		System.out.println();
	}

	public void Lapo2() {
		// aqui se expulsan mas lapos
		System.out.println("Lista de pendientes");
		for (int i = 0; i < pendientes.size(); i++) {
			System.out.print(pendientes.get(i) + " ");
		}

		System.out.println();

		for (int c = 0; c < conductores.size(); c++) {
			System.out.println("Conductor " + conductores.get(c).identificador
					+ ": ");

			Conductor conductor = conductores.get(c);

			for (int u = 0; u < conductor.ruta.size(); u++) {
				System.out.print(conductor.ruta.get(u) + " ");
			}

			System.out.println("");
		}

		System.out.println();
	}

	// Operaciones sobre el estado

	public boolean Move(Conductor condO, Conductor condD, int user) {
		condO.Move(condD, user);
		return condD.ValidarRuta();
	}

	public String toCSV() {
		String s = "Conductor"+ Context.SEPARATOR+"Distancia"+ Context.SEPARATOR+"Ruta\n";

		for (Conductor conductor : getConductores()) {			
			s += conductor.identificador + Context.SEPARATOR;
			s += conductor.getDistanciaTotal() + Context.SEPARATOR;
			for (Integer ru : conductor.getRuta()) {
				s += ru + Context.SEPARATOR;
			}

			s += "\n";
		}
		
		s += "Distancia Total:"+ Context.SEPARATOR + getDistanciaTotal() + "\n";
		
		return s;
	}

	public int llegadaEnHora() {
		int i = 0;
		for (Conductor cond : conductores) {
			if (cond.calculaDistancia() <= Context.MAXDIST) {
				// System.out.println("distancia" +cond.calculaDistancia());
				i++;
			}
		}
		return i;
	}

}
